//配置路由的地方
import Vue from 'vue'
import VueRouter from 'vue-router'
//使用插件
Vue.use(VueRouter)
import routes from './routes'
//引入仓库
import store from '@/store'
//先把VueRouter原型对象的push,先保存一份
let originPush = VueRouter.prototype.push
let originReplace = VueRouter.prototype.replace
//重写push|replace
//第一个参数:告诉原来push方法，你往哪里跳转（传递哪些参数）
VueRouter.prototype.push = function (location, resolve, reject) {
  if (resolve && reject) {
    //call||apply区别:
    // 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
    //不同点: call与apply传递参数: call传递参数用逗号隔开，apply方法执行，传递数组
    originPush.call(this, location, resolve, reject)
  } else {
    originPush.call(
      this,
      location,
      () => {},
      () => {}
    )
  }
}
VueRouter.prototype.replace = function (location, resolve, reject) {
  if (resolve && reject) {
    //call||apply区别:
    // 相同点，都可以调用函数一次，都可以篡改函数的上下文一次
    //不同点: call与apply传递参数: call传递参数用逗号隔开，apply方法执行，传递数组
    originReplace.call(this, location, resolve, reject)
  } else {
    originReplace.call(
      this,
      location,
      () => {},
      () => {}
    )
  }
}
//配置路由
let router = new VueRouter({
  //配置路由
  //第一:路径的前面需要有/(不是二级路由)
  //路径中单词都是小写的
  // component右侧v别给我加单引号【字符串:组件是对象（VueComponent类的实例）】
  routes,
  //滚动行为
  scrollBehavior(to, from, savedPosition) {
    //y代表滚动条在最上方
    return { y: 0 }
  }
})
//全局守卫:前置守卫（在路由跳转之间进行判断)
//全局守卫:只要项目中有任何路由变化，全局守卫都会进行拦截【符合条件走你，不符合条件不能访问】
//全局守卫:全局前置守卫【访问之前进行触发】
router.beforeEach(async (to, from, next) => {
  //to:可以获取到你要跳转到哪个路由信息
  //from:可以获取到你从哪个路由而来的信息
  //next:放行函数  next()放行
  //第一种：next(),放行函数，全部放行！！！
  //第二种:next(path),守卫指定放行到那个路由去
  //token
  //用户登录了,才会有token,未登录一定不会有token
  let hasToken = store.state.user.token
  //用户信息
  let hasName = store.state.user.userInfo.name
  //用户登录
  if (hasToken) {
    //用户登录了,不能去login
    if (to.path == '/login') {
      next('/home')
    } else {
      //用户登陆了,而且还有用户信息【去的并非是login】
      //登陆,去的不是login 去的是【home |search|detail|shopcart】
      //如果用户名已有
      if (hasName) {
        next()
      } else {
        //用户登陆了,但是没有用户信息 派发action让仓库存储用户信息在跳转
        try {
          //发请求获取用户信息以后在放行
          await store.dispatch('getUserInfo')
          next()
        } catch (error) {
          //用户没有信息，还携带token发请求获取用户信息【失败】
          //token【*****失效了】
          //token失效:本地清空数据、服务器的token通知服务器清除
          await store.dispatch('userLogout')
          //回到登录页，重新获取一个新的学生证
          next('/login')
        }
      }
    }
  } else {
    //用户未登录||目前的判断都是放行.将来这里会'回手掏'增加一些判断
    //用户未登录:不能进入/trade、/pay、/paysuccess、/center、/center/myorder  /center/grouporder
    let toPath = to.path
    //要去的路由存在
    if (toPath.indexOf('/trade') != -1 || toPath.indexOf('/pay') != -1 || toPath.indexOf('/center') != -1) {
      //把未登录的时候想去而没有去成的路由地址，存储于地址栏中【路由】
      next('/login?redirect=' + toPath)
    } else {
      next()
    }
  }
})
export default router
